国际化项目中 ICU 是什么
December 06, 2024
在 国际化(i18n)和本地化(l10n) 开发中,ICU(International Components for Unicode) 是一个由 Unicode 联盟维护的开源库,提供了一套强大的工具来处理多语言文本、日期时间、数字格式化、复数规则、性别敏感文本等国际化需求。ICU 是许多操作系统(如 Android、iOS、Linux)和编程语言(如 Java、C/C++、Python)的底层国际化支持库。
ICU 的核心功能
ICU 的主要功能包括:
1. 文本格式化与解析
- 数字格式化(货币、百分比、科学计数法等)
// 示例:格式化货币(美元)
NumberFormat.getCurrencyInstance(Locale.US).format(1234.56) → "$1,234.56"
- 日期时间格式化(支持不同历法,如公历、农历、伊斯兰历等)
// 示例:格式化日期(法语)
SimpleDateFormat("EEEE, d MMMM y", Locale.FRANCE).format(new Date()) → "lundi, 19 mai 2025"
2. 字符串比较与排序(排序规则)
- 支持语言敏感的字符串排序(如德语
ä
排序规则不同于英语a
)。 - Unicode 规范化(Normalization),处理变音符号(如
é
vs.é
)。
3. 字符编码转换
- 支持 UTF-8、UTF-16、GB2312 等多种编码转换,确保文本在不同编码环境下的正确显示。
4. 复数规则(Plural Rules)
- 不同语言的复数形式不同(如英语
1 book
vs.2 books
,俄语有更复杂的规则)。
// 示例:俄语复数规则
"You have {count, plural, one {# книга} few {# книги} many {# книг}}"
5. 性别敏感文本(Gender-aware Formatting)
- 某些语言(如法语、阿拉伯语)的文本会根据性别变化。
// 示例:法语("Vous êtes connecté(e)")
MessageFormat.format("Vous êtes connecté{0}", gender == FEMALE ? "(e)" : "");
6. 断行(Line Breaking)和文本边界检测
- 支持中文、日文等无空格语言的分词(Word Break)
- 换行规则(如 CJK 文本的换行策略)
7. 时区和国际化日历
- 支持全球时区转换(如
America/New_York
vs.Asia/Shanghai
)。 - 非公历日历(如希伯来历、伊斯兰历)的日期计算。
前端(Web)的 ICU 实现
** i18next + 插件**
- GitHub: i18next Plugin
- 特点:
- 支持 ICU 消息格式(
{count, plural, one {...} other {...}}
)。 - 与 React/Vue/Angular 深度集成(
react-i18next
)。 - 扩展性强,支持后端动态加载翻译文件。
- 支持 ICU 消息格式(
- 示例(React + ICU 复数规则):
import i18next from 'i18next';
import ICU from 'i18next-icu';
// ICU 语言规则(可选,默认已内置常见语言)
import en from 'i18next-icu/locale-data/en';
import zh from 'i18next-icu/locale-data/zh';
i18next
.use(new ICU({ localeData: [en, zh] })) // 加载 ICU 插件
.init({
lng: 'en', // 默认语言
resources: {
en: {
translation: {
// ICU 格式的翻译键值
greeting: "Hello, {name}!",
items: "{count, plural, one {# item} other {# items}}",
date: "Today is {date, date, short}",
gender: "{gender, select, male {He} female {She} other {They}} likes this."
}
},
zh: {
translation: {
greeting: "你好,{name}!",
items: "{count, plural, other {# 个物品}}",
date: "今天是 {date, date, short}",
gender: "{gender, select, male {他} female {她} other {他们}}喜欢这个。"
}
}
}
});
### **(1) 复数规则(Pluralization)**
// 英文:根据 count 返回不同复数形式
t('items', { count: 1 }); // "1 item"
t('items', { count: 5 }); // "5 items"
// 中文:中文复数通常只有一种形式
t('items', { count: 5 }); // "5 个物品"
### **(2) 性别敏感文本(Gender)**
t('gender', { gender: 'male' }); // "He likes this." / "他喜欢这个。"
t('gender', { gender: 'female' }); // "She likes this." / "她喜欢这个。"
### **(3) 日期/时间格式化**
t('date', { date: new Date() });
// 英文: "Today is 5/20/2025"
// 中文: "今天是 2025/5/20"
### **(4) 数字格式化(货币、百分比等)**
// 需要在翻译键值中定义格式
{
price: "Price: {value, number, ::currency/USD}"
}
t('price', { value: 1234.56 }); // "Price: $1,234.56"
与普通 i18next 的区别
特性 | 普通 i18next | i18next + ICU |
---|---|---|
复数规则 | 仅基础(_plural ) |
完整 ICU 复数(one/few/many ) |
性别/选择语法 | 不支持 | 支持 {gender, select, ...} |
日期/数字格式化 | 需手动处理 | 内置 {date, date, short} |
灵活性 | 简单场景 | 复杂国际化需求 |
阅读量
Written by xi ming You should follow him on Github